/*
 * Copyright (c) 2012-2017 Red Hat, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Red Hat, Inc. - initial API and implementation
 */
package org.eclipse.che.api.system.server;

import org.eclipse.che.api.system.shared.event.service.StoppingSystemServiceEvent;
import org.eclipse.che.api.system.shared.event.service.SystemServiceItemStoppedEvent;
import org.eclipse.che.api.system.shared.event.service.SystemServiceStoppedEvent;

/**
 * Defines an interface for implementing termination process for a certain service.
 *
 * @author Yevhenii Voevodin
 */
interface ServiceTermination {

  /**
   * Terminates a certain service. It's expected that termination is synchronous.
   *
   * @throws InterruptedException as termination is synchronous some of the implementations may need
   *     to wait for asynchronous jobs to finish their execution, so if termination is interrupted
   *     and implementation supports termination it should throw an interrupted exception
   */
  void terminate() throws InterruptedException;

  /**
   * Returns the name of the service which is terminated by this termination. The name is used for
   * logging/sending events like {@link StoppingSystemServiceEvent}, {@link
   * SystemServiceItemStoppedEvent} or {@link SystemServiceStoppedEvent}.
   */
  String getServiceName();
}
